Fork me on GitHub

设计模式 - 解释器

注意:所有文章除特别说明外,转载请注明出处.

简介

该模式提供了评估语言的语法或表达式的方式。此模式实现了一个表达式接口,该接口解释一个特定的上下文。在编程中需要分析一件事情,并决定其含义所以需要解释器模式来完成。

此模式基于表达式和评估器部分。第一个代表要分析的事情,该分析是由评价者做出,它们知道构成表达的人物的意义。

为了解释一种语言而为语言创建的解释器。

场景

1. 某个特定类型问题发生频率足够高的时候

优点

1. 语法由很多类表示,容易改变和扩展此语言

缺点

1. 当语法规则数目太多时,增加了系统的复杂度

相关设计模式

1. 解释器模式和适配器模式

解释器模式

1.创建表达式接口(抽象表达式类)

public interface Expression {
    //解释方法
    public boolean interpret(String context);
}

2.创建实现上述接口的实体类(终结表达式类)

public class TerminalExpression implements Expression {
   private String data;

   public TerminalExpression(String data){
      this.data = data; 
   }
    //对终结表达式的处理
   @Override
   public boolean interpret(String context) {
      if(context.contains(data)){
         return true;
      }
      return false;
   }
}

public class OrExpression implements Expression {
   private Expression expr1 = null;
   private Expression expr2 = null;

   public OrExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) || expr2.interpret(context);
   }
}

public class AndExpression implements Expression {
   private Expression expr1 = null;
   private Expression expr2 = null;

   public AndExpression(Expression expr1, Expression expr2) { 
      this.expr1 = expr1;
      this.expr2 = expr2;
   }

   @Override
   public boolean interpret(String context) {      
      return expr1.interpret(context) && expr2.interpret(context);
   }
}

3.InterpreterPatternDemo 使用 Expression 类来创建规则 并解析它们

public class InterpreterPatternDemo {

   //规则:Robert 和 John 是男性
   public static Expression getMaleExpression(){
      Expression robert = new TerminalExpression("Robert");
      Expression john = new TerminalExpression("John");
      return new OrExpression(robert, john);    
   }

   //规则:Julie 是一个已婚的女性
   public static Expression getMarriedWomanExpression(){
      Expression julie = new TerminalExpression("Julie");
      Expression married = new TerminalExpression("Married");
      return new AndExpression(julie, married);    
   }

   public static void main(String[] args) {
      Expression isMale = getMaleExpression();
      Expression isMarriedWoman = getMarriedWomanExpression();

      System.out.println("John is male? " + isMale.interpret("John"));
      System.out.println("Julie is a married women? " 
      + isMarriedWoman.interpret("Married Julie"));
   }
}

总结

解释器模式包含以下主要角色:

1.抽象表达式:定义解释器的接口,约定解释器的解释操作,主要包含方法:intercept()。

2.终结符表达式:抽象表达式的子类,实现文法中与终结符相关的操作。

3.非终结符表达式:抽象表达式的子类,用来实现文法中与非终结符相关的操作。

4.环境:通常包含各个解释器需要的数据或是公共的功能,一般用来传递被所有解释器共享的数据。

5.客户端:验证正确与否

本文标题:设计模式 - 解释器

文章作者:Bangjin-Hu

发布时间:2019年10月15日 - 09:22:26

最后更新:2020年03月30日 - 08:23:27

原始链接:http://bangjinhu.github.io/undefined/设计模式 - 解释器模式/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

Bangjin-Hu wechat
欢迎扫码关注微信公众号,订阅我的微信公众号.
坚持原创技术分享,您的支持是我创作的动力.